/* 
 * File:   Lista.h
 * Author: mauro
 *
 * Created on 11 de septiembre de 2014, 01:13
 */

#ifndef LISTA_H
#define	LISTA_H

#include "Nodo.h"
using namespace std;

template<class Tipo>
class Lista {
private:
    Nodo<Tipo> *primero;
    Nodo<Tipo> *ultimo;
    int cantidad;
    void eliminarNodo(Nodo<Tipo> *nodo);

public:

    // Crea una lista.
    // Post: devuelve una nueva lista vacía.

    Lista();

    //creo una lista con datos!

    Lista(Tipo dato);


    // Devuelve verdadero o falso, según si la lista tiene o no elementos enlazados.
    // Pre: la lista fue creada.

    bool estaVacia();

    // Destruye la lista. Si se recibe la función destruir_dato por parámetro,
    // para cada uno de los elementos de la lista llama a destruir_dato.
    // Pre: la lista fue creada. 'destruir_dato' es una función capaz de destruir
    // los datos de la cola, o NULL en caso de que no se la utilice.
    // Post: se eliminaron todos los elementos de la lista.

    ~Lista();


    // Agrega un nuevo elemento a la lista. Devuelve falso en caso de error.
    // Pre: la lista fue creada.
    // Post: se agregó un nuevo elemento al principio o al final de la lista
    // según corresponda, 'dato' es dicho elemento.

    bool insertarPrimero(Tipo dato);

    /*********************************************************************/
    bool insertarUltimo(Tipo dato);

    // Obtiene el valor del primer elemento de la lista. Si la lista tiene elementos,
    // se devuelve el valor del primer elemento. Si está vacía devuelve NULL.
    // Pre: la lista fue creada.
    // Post: se devolvió el valor del primer elemento de la lista sin sacarlo
    // de ella, cuando ésta no está vacía; NULL en caso contrario.
    //template<typename T>

    Tipo verPrimero();
    Tipo verUltimo();

    // Saca el primer elemento de la lista. Si la lista tiene elementos,
    // se quita el primero de la lista, y se devuelve ese valor. Si la lista
    // está vacía, devuelve NULL.
    // Pre: la lista fue creada.
    // Post: si la lista no estaba vacía, se devuelve el primer valor de ella
    // y la lista contiene un elemento menos.

    Tipo borrarPrimero();

    // Devuelve el largo de la lista.
    // Pre: la lista fue creada.
    // Post: se devolvió el largo de la lista. En caso de estar vacía,
    // lógicamente, la función devuelve 0 (cero).

    int getLargo();
    //Se obtiene el Primer elemento de la lista.
    Nodo<Tipo>* getPrimero();
    //Se obtiene el Ultimo elemento de la lista.
    Nodo<Tipo>* getUltimo();
};

#endif	/* LISTA_H */

